/**
 * @description 数据库连接工具类
 * @author wen
 * @date 2025.2.10
 */

const mysql = require('mysql');
const config = require('../db/dbConfig');

// 创建连接池（全局共享）
const pool = mysql.createPool({
  ...config,
  connectionLimit: 20,          // 最大连接数
  queueLimit: 0,               // 无限制排队
  waitForConnections: true,    // 无可用连接时等待
  acquireTimeout: 10000,       // 获取连接超时时间(10秒)
  timezone: 'local'            // 时区设置
});

// 优化后的查询方法
function querySql(sql, params, conn = null) {
  return new Promise((resolve, reject) => {
    const getConnection = conn 
      ? Promise.resolve(conn)   // 使用现有连接（事务场景）
      : new Promise((res, rej) => {
          pool.getConnection((err, connection) => {
            err ? rej(err) : res(connection)
          })
        });

    getConnection.then(connection => {
      console.log('SQL:', sql, 'Params:', params);
      connection.query(sql, params, (err, results) => {
        // 非事务连接需要释放
        if (!conn) connection.release();
        err ? reject(err) : resolve(results);
      });
    }).catch(reject);
  });
}

// 优化事务处理方法
function startTransaction() {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      if (err) return reject(err);
      connection.beginTransaction(err => {
        err ? connection.release() || reject(err) : resolve(connection);
      });
    });
  });
}

// 修改提交/回滚方法
function commitTransaction(conn) {
  return new Promise((resolve, reject) => {
    conn.commit(err => {
      conn.release(); // 无论提交是否成功都释放连接
      err ? reject(err) : resolve();
    });
  });
}

function rollbackTransaction(conn) {
  return new Promise(resolve => {
    conn.rollback(() => {
      conn.release(); // 回滚后释放连接
      resolve();
    });
  });
}
module.exports = {
  querySql,
  startTransaction,
  commitTransaction,
  rollbackTransaction
}